package main

import (
	"fmt"
	"github.com/gin-gonic/gin"
	"io"
	"mime/multipart"
	"os"
)

// "mime/multipart" 使用的包
type MyFiles struct {
	Files []*multipart.FileHeader `form:"files" binding:"required"`
}

func BindFiles(c *gin.Context, obj *MyFiles) error {
	if err := c.ShouldBind(obj); err != nil {
		return err
	}

	// 文件校验逻辑, 例如文件大小, 文件类型等
	// ...

	return nil
}

func demo4() {
	r := gin.Default()

	// 单个文件
	r.POST("/upload", func(c *gin.Context) {
		file, _ := c.FormFile("file")
		in, _ := file.Open()
		out, err := os.Create("./" + file.Filename)
		if err != nil {

		}
		defer in.Close()
		defer out.Close()

		_, err = io.Copy(out, in)

		// 保存文件
		//c.SaveUploadedFile(file, "./"+file.Filename)
		//c.JSON(200, gin.H{"status": "ok"})

		// 返回文件
		c.Writer.Header().Add("Content-Disposition", fmt.Sprintf("attachment; filename=", file.Filename))
		c.File("./" + file.Filename)
	})

	//r.POST("/upload")

	/*
		// 上传多个文件
		r.POST("/uploads", func(c *gin.Context) {
			form, _ := c.MultipartForm()
			file := form.File["files"]
			for _, f := range file {
				fmt.Println(f.Filename)
			}
			c.String(200, "upload ok!")
		})
	*/
	// 多文件上传
	r.POST("/uploads", func(c *gin.Context) {
		var myFiles MyFiles
		if err := BindFiles(c, &myFiles); err != nil {
			c.JSON(500, gin.H{
				"message": err.Error(),
			})
			return
		}
		c.JSON(200, gin.H{
			"message": "ok",
		})

		// 保存文件
		for _, file := range myFiles.Files {
			c.SaveUploadedFile(file, file.Filename)
		}
	})

	r.Run(":8080")
}
